const POINT_STYLE = {
  Angle: 0,
  Color: 11,
  Space: 0,
  SymHeight: 6,
  SymID: 31,
  SymWidth: 6,
}
/**
 *
 * @param {array} position 设置点的经纬度
 * @param {array} attr [{key:"name",value:"武汉",type:"string"}]
 * @param {object} service {name,layerId}
 * @param {string} layer  调用中地接口,加载的地图文档图层
 */
class Point {
  static add({ position, attr, service, layer }) {
    /* 1、几何信息 */
    //创建一个点形状，描述点形状的几何信息
    var gpoint = new Zondy.Object.GPoint(position[0], position[1]) //createPoint();
    //设置当前点要素的几何信息
    var fGeom = new Zondy.Object.FeatureGeometry({
      PntGeom: [gpoint],
    })
    /* 2、图形参数 */
    //描述点要素的符号参数信息
    var pointInfo = new Zondy.Object.CPointInfo(POINT_STYLE)
    //设置当前点要素的图形参数信息
    var webGraphicInfo = new Zondy.Object.WebGraphicsInfo({
      InfoType: 1,
      PntInfo: pointInfo,
    })
    /* 3、属性 */
    //设置添加点要素的属性信息
    var attValue = attr.map((item) => item.value)
    /* 4、几何+图形+属性 构建要素*/
    //创建一个要素
    var feature = new Zondy.Object.Feature({
      fGeom: fGeom,
      GraphicInfo: webGraphicInfo,
      AttValue: attValue,
    })
    //设置要素为点要素
    feature.setFType(1)
    //创建一个要素数据集
    /* 5、创建要素集添加要素 */
    var featureSet = new Zondy.Object.FeatureSet()
    //设置属性结构
    var cAttStruct = new Zondy.Object.CAttStruct({
      FldName: attr.map((item) => item.key),
      FldNumber: attr.length,
      FldType: attr.map((item) => item.type),
    })
    featureSet.AttStruct = cAttStruct
    //添加要素到要素数据集
    featureSet.addFeature(feature)
    /* 6、调用中地服务,添加要素 */
    //创建一个编辑服务类
    var editService = new Zondy.Service.EditDocFeature(
      service.name,
      service.layerId,
      {
        ip: 'localhost',
        port: '6163', //访问IGServer的端口号，.net版为6163，Java版为8089
      }
    )
    //执行添加点要素功能
    editService.add(featureSet, this.onPntSuccess(layer))
  }
  static onPntSuccess(layer) {
    return function (data) {
      if (data.succeed) {
        alert('操作点要素成功！')
        layer.refresh()
      } else {
        alert('操作点要素失败！')
      }
    }
  }
  static query({ position, service, callback }) {
    //1、创建一个用于查询的点形状
    let pointObj = new Zondy.Object.Point2D(position[0], position[1])
    //设置查询点的搜索半径
    pointObj.nearDis = 1
    //2、初始化查询结构对象，设置查询结构包含几何信息
    var queryStruct = new Zondy.Service.QueryFeatureStruct()
    //是否包含几何图形信息
    queryStruct.IncludeGeometry = true
    //是否包含图形显示参数
    queryStruct.IncludeWebGraphic = true
    //3、指定查询规则
    var rule = new Zondy.Service.QueryFeatureRule({
      //是否将要素的可见性计算在内
      EnableDisplayCondition: false,
      //是否完全包含
      MustInside: false,
      //是否仅比较要素的外包矩形
      CompareRectOnly: false,
      //是否相交
      Intersect: true,
    })
    //4、实例化查询参数对象
    var queryParam = new Zondy.Service.QueryParameter({
      geometry: pointObj,
      resultFormat: 'json',
      struct: queryStruct,
      rule: rule,
    })
    //5、实例化地图文档查询服务对象
    var queryService = new Zondy.Service.QueryDocFeature(
      queryParam,
      service.name,
      service.layerId,
      {
        ip: 'localhost',
        port: '6163', //访问IGServer的端口号，.net版为6163，Java版为8089
      }
    )
    //执行查询操作，querySuccess为查询回调函数
    queryService.query(callback)
  }
  static update({ position, attr, fid, service, layer }) {
    /* 1、确定修改的几何位置 */
    var gpoint = new Zondy.Object.GPoint(position[0], position[1]) // 修改位置
    /* 设置当前点要素的几何信息 */
    var fGeom = new Zondy.Object.FeatureGeometry({
      PntGeom: [gpoint],
    })
    /* 2、样式信息 */
    /* 2.2 设置样式信息 */
    var pointInfo = new Zondy.Object.CPointInfo({
      Angle: 0,
      Color: 8, //子图的颜色
      Space: 0,
      SymHeight: 5, //点的高度
      SymID: 31,
      SymWidth: 5, //点的宽度
    })
    /* 设置当点要素的图形参数信息 */
    var webGraphicInfo = new Zondy.Object.WebGraphicsInfo({
      InfoType: 1, //点
      PntInfo: pointInfo,
    })
    /* 3、属性 */
    var attValue = attr.map((item) => item.value)
    /* 4、设置要素 */
    var feature = new Zondy.Object.Feature({
      fGeom: fGeom, //坐标--几何信息
      GraphicInfo: webGraphicInfo, //样式信息
      AttValue: attValue, //属性
    })
    /* 设置要素为点要素 
    点 -->1
    线 -->2
    面 -->3
    */
    feature.setFType(1)
    feature.setFID(fid) //++
    /* 5、设置要素集,添加要素 */
    //创建一个要素数据集
    var featureSet = new Zondy.Object.FeatureSet()
    /* 设置属性结构 */
    var cAttStruct = new Zondy.Object.CAttStruct({
      FldName: attr.map((item) => item.key), //属性的字段名
      FldNumber: 1, //属性的个数
      FldType: attr.map((item) => item.type), //属性的类型
    })
    featureSet.AttStruct = cAttStruct
    /* 添加要素到要素数据集 */
    featureSet.addFeature(feature)
    /* 6、调用服务,执行更新 */
    /* 
    创建一个编辑服务类 
    第一个参数：服务的名称 第二参数：图层的名称
    */
    var editService = new Zondy.Service.EditDocFeature(
      service.name,
      service.layerId,
      {
        ip: 'localhost',
        port: '6163', //访问IGServer的端口号, .net为6163,Java为8089
      }
    )
    //执行添加点要素功能
    editService.update(featureSet, this.onPntSuccess(layer))
  }
}
